ロードバランサーでPiping Serverを負荷分散をする
モチベーション
ただ、執筆時(0.9.1)のPiping Serverではパスで状態を持つ。
状態持つ理由は、Piping Serverはポリシーとしてデータをストレージ等に保存したりしたくないため、ストリーミングされるデータは一瞬だけメモリに存在するような実装になっている。通常のPiping Sereverが1つだけのときは問題ではないが、ロードバランサーでアクセスが複数のPiping Serverに分配されるときは、送信者と受信者は同じPiping Serverにアクセスされるように調節されないといけない。
そもそも、ロードバランサーを使えば高速するのか?という疑問がある。というのもパスベースでHTTPを解釈できるソフトウェアロードバランサーが必要になるため、トラフィックはすべてロードバランサーに集まってしまうはず。Piping Serverはin/outともにデータ量が多くなるはずで、Piping Serverの内部の処理はそれほど負荷がかかるわけでもないので、複数のPiping Serverに分散させることが高速化につながるのかはわからない。ただ、最終的にはやってみないと結論が出せないはずなので、Piping Serverの負荷分散の一つの方法として挑戦。(現在のPiping Serverの実装がシングルスレッドのNode.jsなので、コア数分Piping Serverを使うと自動的にマルチコアになるかも)
https://gh-card.dev/repos/nwtgck/piping-server-load-balancer-docker-compose.svg https://github.com/nwtgck/piping-server-load-balancer-docker-compose
動かし方
以下のコマンドで、にロードバランサーが負荷分散してれるPiping Serverが立ち上がる。 $ docker-compose up
実装
執筆時のの実装では、Piping Serverの台数は4台に設定ファイルにハードコーディングされている。
現状だと、ハードコーディングされているので、実際にロードバランサー付きで使いたい人は、このリポジトリを参考に自分で手を加えるスタイルになると思う。HAProxyでスケールアウト・スケールインがあとからできたらいいが、方法は見つからなかった。パスベースで負荷分散できるリバースプロキシは、HAProxy以外にもあるので、他のプロキシを使うのもいいかなと思っている。 技術とか構成とか